import { insertCart, findCartList, deleteCart, updateCart, checkAllCart } from '@/api/care'
const care = {

  namespaced: true,
  state: () => ({
    // 2.3 测试数据
    // 数据只能写在satate==修改state数据就会触发自动同步机制
    // str: {
    //   // nam: 'cp'
    // }
    // 22.先给购物车一个空数组
    cartList: []
  }),
  mutations: {
    // 修改state里的数据
    // modify (state) {
    //   state.str.name = 'cpm'
    // }
    // 22购物车修改数据
    setCartList (state, list) {
      state.cartList = list
    },
    // 勾选修改状态，自定义必须从mutations里修改数据
    selectedFn (state, { skeyId, selected }) { // skeyid是id，selected勾选状态
      // / 1.找到对应项，
      // find查找item某个项，用于场景：修改
      //   // findIndex查找索引，下标值，找到某个项，然后删掉他（splice（index，1））
      const item = state.cartList.find(item => item.skeyId === skeyId)// state数据里的cartList找到（当前每一项的id等于我要找的id）
      // 2.赋值操作`
      item.selected = selected// 上面每一项的勾选等于我要照抄的勾选
    }

  },
  actions: {
    // 22购物车发送请求数据
    async asyncSetCartList (ctx, { skuId, count }) {
      // 1.加入购物车接口（以及传递的参数）
      await insertCart({ skuId, count })
      // 2. 获取登录后最新的购物车列表
      const res = await findCartList()
      // 3.把购物车列表存入state
      ctx.commit('setCartList', res.result)
    },
    // 22.删除购物车
    async asyncDelCart (ctx, ids) {
      // 1.删除购物车接口传参数
      await deleteCart(ids)
      // 2. 获取登录后最新的购物车列表
      const res = await findCartList()
      // 3.把购物车列表存入state
      ctx.commit('setCartList', res.result)
    },
    // 25. 单选勾选请求
    async asyncupdateCart (ctx, good) { // good有三个参数，但是这里写成一个不用结构
      //  1.单选勾选传入参数
      await updateCart(good)
      // 2. 获取登录后最新的购物车列表
      const res = await findCartList()
      // 3.把购物车列表存入state
      ctx.commit('setCartList', res.result)
    },
    // 27,全选勾选
    async asyncCheckAllCart (ctx, selected) {
      // 1.全选勾选本来接口是有两个参数的一个是selected，一个是所有商品的集合
      // 但是集合不用写，因为state就有这个数据，直接等会直接拿，用映射找到当前的id
      await checkAllCart({
        selected, // 状态
        id: ctx.state.cartList.map((item) => item.skuId)
      })
      // 2. 获取登录后最新的购物车列表
      const res = await findCartList()
      // 3.把购物车列表存入state
      ctx.commit('setCartList', res.result)
    }

  },
  getters: {
    // 商品总钱数：把cartList中所有项的connt*pice累加
    allPrice (state) {
      return state.cartList.reduce((a, b) => a + b.count * b.price, 0)
    },
    // 总件数：把cartList中所有项的count累加
    allCount (state) {
      return state.cartList.reduce((a, b) => a + b.count, 0)
    },
    // 已选择几件商品数量：把cartList中所有selected（选中）为true的项筛选出来
    // 然后吧筛选出来的数组中每个count加起来
    seletedCount (state) {
      return state.cartList.filter(i => i.selected === true)
        .reduce((a, b) => a + b.count, 0)
    },
    // 商品合计：把cartList中所有selected（选中）为true的项筛选出来,把cartList中所有项的count*pice
    seletedPrice (state) {
      return state.cartList.filter(i => i.selected === true)
        .reduce((a, b) => a + b.count * b.price, 0)
    },
    // 给全选定义的语义化
    isAll (state) {
      // 当前的每一项等于勾选的
      return state.cartList.every((item) => item.selected)
    }
  }

}
export default care// 默认导出
